Prepared Statement 설정
✒️ 2025-05-26 15:06 내용 수정
- MySQL로 프로젝트를 진행하던 중 Sequelize같은 ORM을 사용하지 않고 DB에 연결을 했기에 SQL Injection 공격에 취약하다는 것을 발견했다.
- 서버 API에서 직접 SQL문을 작성해서 DB에 query를 요청하는 식으로 설계했다.
- SQL Injection 공격 취약에 대비하기 위해 prepared statement를 사용하여 코드를 변경했다.
- MySQL과 Node를 연결한 경우, mysql 라이브러리가 필요하다.(프로젝트엔 mysql2를 사용했다.)
- 사용은
mysql.format(sql statement, parameter)함수를 사용하여 적용한다. - 해당 함수는 SQL문과 쿼리의 매개변수들을 받아들여 안전한 SQL 문자열로 변환해주고, 쿼리 문자열에 대해 적절한 escape를 수행하여 보안 문제를 예방해준다.
- 내용 참고 : chatGPT 3.5
- DB 연결 과정은 생략했다. 상세 내용은 MySQL과 연동을 참고.
const mysql = require('mysql2');
const router = require('express').Router();
router.get('/user', async (req, res) => { // router를 적용한 상태
const { id } = req.query; // 쿼리문으로 id를 요청했다고 가정
let sql = 'SELECT * FROM user WHERE id = ?'; // ? 위치를 매개변수로 대체할 예정
try {
// mysql.format()을 사용하여 prepared statement를 적용
const query = mysql.format(sql, [id]);
const result = await pool.query(query);
res.send(result);
} catch (error) {
console.error(error);
res.status(500).send('error');
}
});